package com.heima.article.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.article.mapper.ArticleConfigMapper;
import com.heima.article.mapper.ArticleContentMapper;
import com.heima.article.mapper.ArticleMapper;
import com.heima.article.service.ArticleService;
import com.heima.common.constants.ArticleConstants;
import com.heima.model.article.dtos.ArticleDto;
import com.heima.model.article.dtos.ArticleHomeDto;
import com.heima.model.article.pojos.ApArticle;
import com.heima.model.article.pojos.ApArticleConfig;
import com.heima.model.article.pojos.ApArticleContent;
import com.heima.model.common.dtos.ResponseResult;
import com.heima.model.common.enums.AppHttpCodeEnum;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * @author 10161
 */
@Service
public class ArticleServiceImpl extends ServiceImpl<ArticleMapper, ApArticle> implements ArticleService {
    private final Short MAX_PAGE_SIZE = 50;

    @Autowired
    private ArticleMapper articleMapper;

    @Autowired
    private ArticleConfigMapper articleConfigMapper;

    @Autowired
    private ArticleContentMapper articleContentMapper;

    /**
     * 在这里我们同时也要对可能从前端传来的不太合理的数据进行预防处理
     * 比如查询页面过大、类型没有啥的，我们都需设置一些默认值防止出错
     *
     * @param dto
     * @param type
     * @return
     */
    @Override
    public List<ApArticle> loadArticleList(ArticleHomeDto dto, Short type) {
        //1.先对页面进行预防性设置
        Integer size = dto.getSize();
        if (size == null || size == 0) {
            size = 10;
        }
        size = Math.min(size, MAX_PAGE_SIZE);
        dto.setSize(size);

        //2.对 type 进行预防性设置，如果不为  1: 查询更多   2：查询最新,则设为默认查更多
        if (!type.equals(ArticleConstants.LOADTYPE_LOAD_MORE)
                && !type.equals(ArticleConstants.LOADTYPE_LOAD_NEW)) {
            //设置默认的就是查询最新
            type = ArticleConstants.LOADTYPE_LOAD_NEW;
        }

        //2.对 文章类型进行预防性设置， 如果为null，那给默认值
        if (StringUtils.isBlank(dto.getTag())) {
            dto.setTag(ArticleConstants.DEFAULT_TAG);
        }

        //3.时间校验
        if (dto.getMaxBehotTime() == null) {
            dto.setMaxBehotTime(new Date());
        }
        if (dto.getMinBehotTime() == null) {
            dto.setMinBehotTime(new Date());
        }


        List<ApArticle> apArticles = articleMapper.loadArticleList(dto, type);
        return apArticles;


    }

    /**
     * article保存
     *
     * @param dto
     * @return
     */
    @Override
    public ResponseResult saveArticle(ArticleDto dto) {
        //1.参数的预见性判断，为空直接返回
        if (dto == null) {
            return ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);
        }
        //2.判断是否存在articleId
        ApArticle article = new ApArticle();
        BeanUtils.copyProperties(dto, article);

        if (dto.getId() != null) {
            //3.有articleId则是news已经发布过上架，这次是修改操作 （操纵3个表 ap_article ap_article_content）
            //3.1修改文章
            updateById(article);
            //3.2 修改文章内容
            LambdaQueryWrapper<ApArticleContent> wrapper = new LambdaQueryWrapper<>();
            wrapper.eq(ApArticleContent::getArticleId, dto.getId());
            ApArticleContent apArticleContent = articleContentMapper.selectOne(wrapper);
            apArticleContent.setContent(dto.getContent());
            articleContentMapper.updateById(apArticleContent);
            return ResponseResult.okResult(dto.getId());
        }
        //4.dto中没有articleId 则是news 还没有将content保存，在这里做保存操作（操纵3个表 ap_article  ap_article_config  ap_article_content）

        //4.1 操作article表
        save(article);

        //4.2 操作 ApArticleConfig表
        ApArticleConfig apArticleConfig = new ApArticleConfig(article.getId());
        articleConfigMapper.insert(apArticleConfig);

        //4.3 操作 ApArticleContent表
        ApArticleContent apArticleContent = new ApArticleContent();
        apArticleContent.setArticleId(article.getId());
        apArticleContent.setContent(dto.getContent());
        articleContentMapper.insert(apArticleContent);


        //5.保存好后，获取articleId，返回articleId
        return ResponseResult.okResult(article.getId());
    }


}
